package com.nowcoder.community.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @ClassName TestAspect
 * @Description
 * @Author hhwu
 * @Date 2022/5/24 22:27
 * Version 1.0
 **/
// 打开下面2个注解即可测试
//@Component
//@Aspect//声明此类为方面组件
public class TestAspect {
    /**
     * @Author hhwu
     * @Description //TODO AOP学习！切入点就是一个方法
     * @Date 22:38 2022/5/24
     **/

    // 指定切入点的返回值为表示任何返回值类型*，切入点为service包下的所有类*的所有方法*的所有参数..
    @Pointcut("execution(* com.nowcoder.community.service.*.*(..))")
    public void pointcut() {
    }

    @Before("pointcut()")// 在指定的切入点前执行
    public void before() {
        System.out.println("before");
    }

    @After("pointcut()")
    public void after() {
        System.out.println("after");
    }

    @AfterReturning("pointcut()")
    public void afterRetuning() {
        System.out.println("afterRetuning");
    }

    @AfterThrowing("pointcut()")
    public void afterThrowing() {
        System.out.println("afterThrowing");
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("around before");// 在被织入的方法前执行的逻辑
        Object obj = joinPoint.proceed();// 执行被织入的方法
        System.out.println("around after");// 在被织入的方法后执行的逻辑
        return obj;//
    }
}
